﻿
CREATE PROCEDURE [dbo].[ShiftOutLinesInsert]
(--расход по внутреннему перемещению
	@DocId int,
	@PartyId int, --идентификатор перемещяемой партии. Первично по отношению к @ReturnLineId
	@Qntty int,
	@RetailSum decimal(19, 2),
	@Note varchar(250),
	@MD datetime,
	@MW varchar(50)
)
AS
DECLARE @strMsg nvarchar(500), @intRet int, @intErrCode int, @intNextId int
DECLARE @intDocTypeId int, @intShiftDepartmentId int
DECLARE @datDocDate smalldatetime, @datInputDocDate smalldatetime
DECLARE @intGoodsId int, @ReturnLineId int --идентификатор перемещяемой строки приходного документа
DECLARE @intInputCount int, @intOutputCount int

SET NOCOUNT ON
IF (@DocId Is Null) OR (@PartyId Is Null) OR (@Qntty Is Null) OR (@RetailSum Is Null)
BEGIN
	SELECT @intErrCode = 1, @strMsg = 'Неправильные параметры в вызове процедуры ' + Object_Name(@@Procid) + ' !'
	RAISERROR (@strMsg, 11, 1)
	RETURN @intErrCode
END

IF (@Qntty <=0) OR (@RetailSum <=0)
BEGIN
	SELECT @intErrCode = 2, @strMsg = 'Количество и сумма д.б. больше нуля !'
	RAISERROR (@strMsg, 11, 1)
	RETURN @intErrCode
END

SELECT @intDocTypeId = DocTypeId, @intShiftDepartmentId = ShiftDepartmentId, @datDocDate = DocDate
FROM [CA].[Documents] WHERE Id = @DocId
IF (@intDocTypeId Is Null)
BEGIN
	SELECT @intErrCode = 3, @strMsg = 'Не найден документ с идентификатором ' + cast(@DocId as varchar(20)) + ' !'
	RAISERROR (@strMsg, 11, 1)
	RETURN @intErrCode
END

IF (@intDocTypeId <> 4)
BEGIN
	SELECT @intErrCode = 4, @strMsg = 'Неправильный тип документа с идентификатором ' + cast(@DocId as varchar(20)) + ' !'
	RAISERROR (@strMsg, 11, @intErrCode)
	RETURN @intErrCode
END

IF (@intShiftDepartmentId Is Null)
BEGIN
	SELECT @intErrCode = 5, @strMsg = 'Не указано подразделение в документе с идентификатором ' + cast(@DocId as varchar(20)) + ' !'
	RAISERROR (@strMsg, 11, 1)
	RETURN @intErrCode
END

SELECT @ReturnLineId = L.Id, @intDocTypeId = D.DocTypeId, @datInputDocDate = D.DocDate, @intGoodsId = P.GoodsId
FROM [CA].[GoodsDocLines] L INNER JOIN CD.Parties P ON L.PartyId = P.Id AND L.DocId = P.DocId
INNER JOIN CA.Documents D ON P.DocId = D.Id
WHERE P.Id = @PartyId

IF @datDocDate < @datInputDocDate 
BEGIN
	SELECT @intErrCode = 7, @strMsg = 'Дата расходного документа меньше даты приходного документа!'
	RAISERROR (@strMsg, 11, 1)
	RETURN @intErrCode
END

IF [dbo].[CheckQuarantineForGoods](@intGoodsId) <> 0  
BEGIN
	SELECT @intErrCode = 8, 
	@strMsg = 'Товар с идентификатором ' + cast(@intGoodsId as varchar(20)) + ' находится в карантине!'
	RAISERROR (@strMsg, 11, 1)
	RETURN @intErrCode
END

--проверка товародвижения
SET @intErrCode = 0 - @Qntty
EXEC @intRet = dbo.CheckPartyFlow @PartyId, @intErrCode, @datDocDate, @intInputCount OUTPUT, @intOutputCount OUTPUT
IF @intRet <> 0 RETURN @intRet

EXEC [dbo].[ProcessStatistic] @Note OUTPUT, @MD OUTPUT, @MW OUTPUT
--получение значения идентификатора
EXEC @intRet = dbo.GetNextCounterFor 'GoodsLines', @intNextId OUTPUT
IF @intRet <> 0 RETURN @intRet

	SET NOCOUNT OFF;
INSERT INTO [CA].[GoodsDocLines] (Id, [DocId], [PartyId], [Qntty], [RetailSum], ReturnLineId, [Note], [MD], [MW]) 
VALUES ( @intNextId, @DocId, @PartyId, @Qntty * (-1), @RetailSum * (-1.0), @ReturnLineId, @Note, @MD, @MW);

SELECT L.Id, L.DepartmentId, L.DocId, L.PartyId, 
L.Qntty * (-1) AS Qntty, L.RetailSum * (-1.0) AS RetailSum, L.ReturnLineId,
L.Note, L.MD, L.MW 
FROM CA.GoodsDocLines AS L WHERE L.Id = @intNextId

RETURN 0
